home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor1 / lqpoles.src < prev    next >
Text File  |  1991-02-21  |  12KB  |  716 lines

  1. %%HP: T(3)A(D)F(.);
  2. @ Optimal root placement for Linear-Quadratic Optimum Controll
  3. @ LQPOLES
  4. @ by James Walters
  5.  
  6. DIR
  7.  
  8. PG4
  9. DIR
  10.  
  11. MAIN
  12. DIR
  13.  
  14. EE
  15. DIR
  16.  
  17. CNTRL
  18. DIR
  19.  
  20. STVR
  21. DIR
  22.  
  23. @ For the optimal pole assignment program, begin with a system
  24. @ dX/dt = A*X+B*u, y = C*X+D*u
  25. @ and a cost function J = integral( TRN(X)*Q*X + R*u^2)
  26. @ to be minimized.
  27. @ Store A, B, C, D, Q, and R matrices as variables.
  28. @
  29. @ run OPRTS. 
  30. @ On the stack will be the optimal feedback gain matrix g.
  31. @ The optimal closed loop system is of the form
  32. @ dX/dt = A*X + B*(-g*X)
  33. @ New variables Qo, Qc, H, W, a, ahat, n are also formed by this program
  34. @ Included below is both the main program, and a sample system
  35. @
  36. @ The optimal roots should be -35, -91.6, -12.57
  37. @
  38. OPRTS    @ OPTIMAL ROOTS PLACEMENT
  39.         \<< HAMLTN    @ form hamiltonian matrix
  40. CHEQ ROOTS 2 n *    @ find roots of hamiltonian
  41. \->LIST \-> HROOTS
  42.           \<< 1 n 2 *
  43.             FOR I    @ keep roots with negative real parts
  44. HROOTS I GET DUP
  45.               IF RE
  46. 0 >
  47.               THEN
  48. DROP
  49.               END
  50.             NEXT
  51.           \>> n \->LIST  @ place optimal roots into list
  52. IRT LTOV 'ahat' STO @ transform optimal roots into polynomial vector ahat
  53. POLEPL g     @ place roots of system at optimal position, return optimal 
  54.         \>>       @ gain matrix on stack.
  55.  
  56.       POLEPL        @ POLE PLACEMENT PROGRAM
  57.         \<< A CHEQ    @ find characteristic equation of system
  58. DUP SIZE 1 - 'n'
  59. STO DUP LTOV 'a'    @ place eq in vector form
  60. STO n IDN 'W' STO 2 @ form wronskian matrix W
  61. n
  62.           FOR i DUP
  63. i GET i n
  64.             FOR j
  65. DUP 'W(j-i+1,j)'
  66. STO
  67.             NEXT
  68. DROP
  69.           NEXT DUP
  70. CNTRLBL DROP Qc W * @ do controllability test, generate Qc
  71. INV TRN ahat a - *       @ determine gain matrix g to place poles at desired
  72. EVAL TRN 'g' STO          @ location. Store gain matrix as g.
  73.         \>>
  74.  
  75.       OBSVBL    @ OBSERVABILITY MATRIX PROGRAM
  76.         \<< n IDN DUP
  77. 'Qo' STO 1 n
  78.           FOR j DUP
  79. C TRN * 1 n
  80.             FOR i
  81. DUP i 1 2 \->LIST GET
  82. Qo SWAP i j 2 \->LIST
  83. SWAP PUT 'Qo' STO
  84.             NEXT
  85. DROP A TRN *
  86.           NEXT DROP
  87. Qo DET 0 \=/
  88.         \>>
  89.  
  90.       CNTRLBL    @ CONTROLLABILITY MATRIX PROGRAM
  91.         \<< n IDN DUP
  92. 'Qc' STO 1 n
  93.           FOR j DUP
  94. B * 1 n
  95.             FOR i
  96. DUP i 1 2 \->LIST GET
  97. Qc SWAP i j 2 \->LIST
  98. SWAP PUT 'Qc' STO
  99.             NEXT
  100. DROP A *
  101.           NEXT DROP
  102. Qc DET 0 \=/
  103.         \>>
  104.  
  105.       HAMLTN    @ HAMILTONIAN MATRIX PROGRAM
  106.         \<< B R INV *
  107. B TRN * -1 * \-> tmp
  108.           \<< n 2 *
  109. IDN 'H' STO H 1 n
  110.             FOR i 1
  111. n
  112.               FOR j
  113. A i j 2 \->LIST GET i
  114. j 2 \->LIST SWAP PUT
  115. Q i j 2 \->LIST GET
  116. -1 * i n + j 2
  117. \->LIST SWAP PUT A j
  118. i 2 \->LIST GET -1 *
  119. i n + j n + 2 \->LIST
  120. SWAP PUT tmp i j 2
  121. \->LIST GET i j n + 2
  122. \->LIST SWAP PUT
  123.               NEXT
  124.             NEXT
  125. 'H' STO H
  126.           \>>
  127.         \>>
  128.  
  129.       LTOV    @ LIST TO COLUMN VECTOR PROGRAM
  130.         \<< DUP SIZE
  131. 1 - DUP 1 2 \->LIST 0
  132. CON \-> n a
  133.           \<< 2 n 1 +
  134.             FOR i
  135. DUP i GET RE 'a(i-1,1)' STO
  136.             NEXT
  137. DROP a
  138.           \>>
  139.         \>>
  140.  
  141.       H        @ EXAMPLE HAMILTONIAN MATRIX
  142. [[ 91 2 3 -1 -2 -3 ]
  143.  [ 4 5 65 -2 -4 -6 ]
  144.  [ 7 8 19 -3 -6 -9 ]
  145.  [ -1 0 0 -91 -4 -7 ]
  146.  [ 0 -1 0 -2 -5 -8 ]
  147.  [ 0 0 -1 -3 -65 -19 ]]
  148.  
  149.       Q        @ EXAMPLE STATE VARIABLE WEIGHTING MATRIX
  150. [[ 1 0 0 ]
  151.  [ 0 1 0 ]
  152.  [ 0 0 1 ]]
  153.  
  154.       R 1    @ EXAMPLE CONTROL WEIGHT
  155.  
  156.       g        @ EXAMPLE STATE VARIBALE FEEDBACK MATRIX
  157. [[ 335.453288908 -2.61764442827 -25.3230917657 ]]
  158.  
  159.       W    @ EXAMPLE WRONSKIAN MATRIX
  160. [[ 1 -115 1730 ]
  161.  [ 0 1 -115 ]
  162.  [ 0 0 1 ]]
  163.  
  164.       a        @ EXAMPLE SYSTEM CHARACTERISTIC VECTOR
  165. [[ -115 ]
  166.  [ 1730 ]
  167.  [ 37926 ]]
  168.  
  169.       ahat    @ EXAMPLE OPTIMAL CHARACTERISTIC VECTOR
  170. [[ 139.248724755 ]
  171.  [ 4805.60367291 ]
  172.  [ 40398.0276333 ]]
  173.  
  174.       Qo    @ EXAMPLE OBSERVABILITY MATRIX
  175. [[ 1 8 132 ]
  176.  [ 0 10 162 ]
  177.  [ 1 12 192 ]]
  178.  
  179.       C        @ C MATRIX OF y = C*X+D*u
  180. [[ 1 0 1 ]]
  181.  
  182.       Qc    @ EXAMPLE CONTROLLABILITY MATRIX
  183. [[ 1 104 10122 ]
  184.  [ 2 209 6661 ]
  185.  [ 3 80 3920 ]]
  186.  
  187.       n 3    @ SYSTEM ORDER
  188.  
  189.       B        @ dXdt = A*X+B*u
  190. [[ 1 ]
  191.  [ 2 ]
  192.  [ 3 ]]
  193.  
  194.       A        @ dXdt = A*X+B*u
  195. [[ 91 2 3 ]
  196.  [ 4 5 65 ]
  197.  [ 7 8 19 ]]
  198.  
  199.             END    @ END OF STATE VARIABLE DIRECTORY
  200.         END    @ END OF CNTRL DIRECTORY
  201.                 END    @ END OF EE DIR
  202.                 END    @ END OF MAIN DIR
  203.  
  204.       CHEQ @ FINDS CHARACTERISTIC EQUATION OF A MATRIX
  205.         \<< TRCN SYM
  206.         \>>
  207.  
  208.       LVCT @
  209.         \<< \-> n
  210.           \<< n 1
  211. \->LIST 0 CON n 1
  212.             FOR i i
  213. 1 \->LIST 3 ROLL PUT
  214. -1
  215.             STEP
  216.           \>>
  217.         \>>
  218.  
  219.       GSO
  220.         \<< DUP SIZE
  221. LIST\-> DROP DUP DUP
  222. 2 + ROLLD \->LIST \-> M
  223.           \<< 2 SWAP
  224.             FOR n M
  225. n GET 1 n 1 -
  226.               FOR i
  227. M i GET DUP DUP2
  228. DOT INV * SWAP 3
  229. PICK DOT * -
  230.               NEXT
  231. n M SWAP ROT PUT
  232. 'M' STO
  233.             NEXT M
  234. LIST\-> DROP
  235.           \>>
  236.         \>>
  237.  
  238.       TRCN
  239.         \<< DUP SIZE
  240. 1 GET \-> g n
  241.           \<< g 'tmp'
  242. STO { } 1 n
  243.             START 0
  244. 1 n
  245.               FOR i
  246. tmp i DUP 2 \->LIST
  247. GET +
  248.               NEXT
  249. 1 \->LIST + 'tmp' g
  250. STO*
  251.             NEXT
  252. 'tmp' PURGE
  253.           \>>
  254.         \>>
  255.  
  256.       SYM
  257.         \<< DUP SIZE
  258. \-> b n
  259.           \<< { 1 } 1
  260. n
  261.             FOR i \->
  262. s
  263.               \<< 0 1
  264. i
  265. FOR j b j GET s i j
  266. - 1 + GET * -
  267. NEXT i / 1 \->LIST s
  268. SWAP +
  269.               \>>
  270.             NEXT
  271.           \>>
  272.         \>>
  273.  
  274.       PSERS
  275.         \<< \-> X
  276.           \<< LIST\-> 0
  277. SWAP 1
  278.             FOR n n
  279. 1 + ROLL X n 1 - ^
  280. * + -1
  281.             STEP
  282.           \>>
  283.         \>>
  284.  
  285.       CST { UP MAIN
  286. EXCO ROOTS PADD
  287. PMUL PDIV SYM\-> \->SYM
  288. IRT CST PG5 CHEQ
  289. \->VCT }
  290.     END    @ END OF PG4 DIRECTORY
  291.  
  292.  
  293.   ROOTS    @ Finds roots of any polynomial
  294.     \<< TRIM DUP SIZE
  295. \-> n
  296.       \<<
  297.         IF n 5 >
  298.         THEN DUP
  299. BAIRS SWAP OVER
  300. PDIV DROP \-> A B
  301.           \<< A ROOTS
  302. B ROOTS
  303.           \>>
  304.         ELSE PROOT
  305.         END
  306.       \>>
  307.     \>>
  308.  
  309.   EXCO    @ Expand completely algebraic
  310.     \<<
  311.       \<< EXPAN
  312.       \>> MULTI
  313.       \<< COLCT
  314.       \>> MULTI
  315.     \>>
  316.  
  317.   PADD    @ Adds to polynomial lists
  318.     \<< DUP2 SIZE
  319. SWAP SIZE \-> A B nB
  320. nA
  321.       \<< A L\178A B L\178A
  322.         IF nA nB <
  323.         THEN SWAP
  324.         END
  325.         IF nA nB \=/
  326.         THEN 1 nA
  327. nB - ABS
  328.           START 0
  329.           NEXT
  330.         END nA nB -
  331. ABS 1 + ROLL OBJ\-> 1
  332. GET nA nB - ABS +
  333. \->ARRY + L\178A
  334.       \>>
  335.     \>>
  336.  
  337.   PMUL    @ Multiplies polynomial lists
  338.     \<< DUP2 SIZE
  339. SWAP SIZE \-> A B nB
  340. nA
  341.       \<< { }
  342.         IF nB 1 >
  343.         THEN 2 nB
  344.           START 0 +
  345.           NEXT
  346.         END DUP 'A'
  347. STO+ 'A' SWAP STO+
  348. A OBJ\-> \->ARRY B OBJ\->
  349. DROP
  350.         IF nB 1 >
  351.         THEN 2 nB
  352.           FOR J J
  353. ROLL
  354.           NEXT
  355.         END
  356.         IF 3 nA nB
  357. + \<=
  358.         THEN 3 nA
  359. nB +
  360.           START 0
  361.           NEXT
  362.         END nA nB 1
  363. - 2 * + \->ARRY 2 nA
  364. nB +
  365.         START DUP2
  366. DOT 3 ROLLD OBJ\->
  367. SWAP nA nB 1 - 2 *
  368. + 1 + ROLLD \->ARRY
  369.         NEXT DROP2
  370. nA nB + 1 - \->LIST
  371.       \>>
  372.     \>>
  373.   PDIV
  374.     \<< DUP SIZE 3
  375. ROLLD OBJ\-> \->ARRY
  376. SWAP OBJ\-> \->ARRY \-> c
  377. b a
  378.       \<< a b
  379.         IF c 1 SAME
  380.         THEN OBJ\->
  381. DROP / OBJ\-> 1 GET
  382. \->LIST { 0 }
  383.         ELSE
  384.           WHILE
  385. OVER SIZE 1 GET c \>=
  386.           REPEAT
  387. DIVV
  388.           END DROP
  389. \-> d
  390.           \<< a SIZE
  391. 1 GET c 1 - - \->LIST
  392. d OBJ\-> OBJ\-> DROP
  393. \->LIST
  394.           \>>
  395.         END
  396.       \>>
  397.     \>>
  398.   SYML
  399.     \<< 0 \-> E n
  400.       \<<
  401.         DO 0 'X'
  402. STO E EVAL n ! /
  403. 'X' PURGE 1 'n'
  404. STO+
  405.         UNTIL E 'X'
  406. \.d DUP 'E' STO
  407.           IF TYPE 0
  408. ==
  409.           THEN
  410.             IF E 0
  411. ==
  412.             THEN 1
  413.             ELSE 0
  414.             END
  415.           ELSE 0
  416.           END
  417.         END 2 n
  418.         FOR i i
  419. ROLL
  420.         NEXT n
  421. \->LIST
  422.       \>>
  423.     \>>
  424.   LSYM
  425.     \<< 'X' \-> x
  426.       \<< LIST\-> 0
  427. SWAP 1
  428.         FOR n n 1 +
  429. ROLL x n 1 - ^ * +
  430. -1
  431.         STEP
  432.       \>>
  433.     \>>
  434.   IRT
  435.     \<< OBJ\-> \-> n
  436.       \<<
  437.         IF n 0 >
  438.         THEN 1 n
  439.           START n
  440. ROLL { 1 } SWAP NEG
  441. +
  442.           NEXT
  443.         ELSE { 1 }
  444.         END
  445.         IF n 1 >
  446.         THEN 2 n
  447.           START
  448. PMUL
  449.           NEXT
  450.         END
  451.       \>>
  452.     \>>
  453.   MULTI
  454.     \<< \-> p
  455.       \<<
  456.         DO DUP p
  457. EVAL
  458.         UNTIL DUP
  459. ROT SAME
  460.         END
  461.       \>>
  462.     \>>
  463.   PROOT
  464.     \<< LIST\-> \->ARRY
  465. DUP 1 GET / ARRY\->
  466. LIST\-> DROP 1 - DUP
  467. 2 + ROLL DROP { NEG
  468. QUD CUBIC QUAR }
  469. SWAP GET EVAL
  470.     \>>
  471.   QUAR
  472.     \<< 3 PICK NEG
  473. DUP 6 ROLLD 5 PICK
  474. 4 PICK * 3 PICK 4 *
  475. - 5 ROLL 4 * 6 PICK
  476. SQ - 4 PICK * 5
  477. PICK SQ - CUBIC 3
  478. \->LIST 1 3
  479.       FOR n DUP n
  480. GET 2 / SQ n 2 +
  481. PICK - ABS SWAP
  482.       NEXT 4 ROLLD
  483. DUP2
  484.       IF <
  485.       THEN SWAP
  486. DROP 3
  487.       ELSE DROP 2
  488.       END 3 ROLLD
  489.       IF >
  490.       THEN DROP 1
  491.       END GET 4
  492. ROLL 2 / SWAP 2 /
  493. DUP SQ 4 ROLL - \v/
  494.       IF DUP ABS
  495.       THEN 3 DUPN 3
  496. ROLLD * 6 ROLL 2 /
  497. - SWAP /
  498.       ELSE 3 PICK
  499. SQ 6 ROLL + 3 PICK
  500. 2 * + \v/
  501.       END 5 ROLL
  502. DROP 3 ROLLD 4 DUPN
  503. + 3 ROLLD + SWAP
  504. QUD 6 ROLLD 6 ROLLD
  505. - 3 ROLLD - SWAP
  506. QUD
  507.     \>>
  508.   CUBIC
  509.     \<< 3 PICK -3 / 3
  510. PICK 5 PICK SQ 3 /
  511. - 5 ROLL DUP 3 ^ 2
  512. * SWAP 9 * 6 ROLL *
  513. - 27 / 4 ROLL + NEG
  514. OVER ABS 0
  515.       IF ==
  516.       THEN 3 INV ^
  517. SWAP DROP 0 SWAP
  518.       ELSE 2 / DUP
  519. SQ 3 PICK 3 ^ 27 /
  520. + \v/ - 3 INV ^ SWAP
  521. OVER / 3 / NEG
  522.       END -1 3 \v/
  523. R\->C 2 / 4 ROLLD 3
  524. DUPN 3 DUPN + + 8
  525. ROLLD 7 PICK * SWAP
  526. 7 PICK / + + 5
  527. ROLLD 4 PICK / SWAP
  528. 4 ROLL * + +
  529.     \>>
  530.   TRIM
  531.     \<< OBJ\-> \-> n
  532.       \<< n
  533.         WHILE ROLL
  534. DUP NOT n 1 - AND
  535.         REPEAT DROP
  536. 'n' DECR
  537.         END n ROLLD
  538. n \->LIST
  539.       \>>
  540.     \>>
  541.   RDER
  542.     \<< \-> F G
  543.       \<< G F PDER
  544. PMUL G PDER { -1 }
  545. PMUL F PMUL PADD G
  546. G PMUL
  547.       \>>
  548.     \>>
  549.   PDER
  550.     \<< OBJ\-> \-> n
  551.       \<< 1 n
  552.         FOR i n
  553. ROLL n i - *
  554.         NEXT DROP
  555.         IF n 1 ==
  556.         THEN { 0 }
  557.         ELSE n 1 -
  558. \->LIST
  559.         END
  560.       \>>
  561.     \>>
  562.   PF
  563.     \<< MAXR { } \-> Z
  564. P OLD LAST
  565.       \<< 1 P SIZE
  566.         FOR I P I
  567. GET \-> p1
  568.           \<<
  569.             IF p1
  570. OLD \=/
  571.             THEN Z
  572. p1 EVPLY 1 P SIZE
  573.               FOR J
  574. IF P J GET P I GET
  575. \=/
  576. THEN p1 P J GET - /
  577. END
  578.               NEXT
  579. p1 'OLD' STO { }
  580. 'LAST' STO
  581.             ELSE
  582.               IF {
  583. } LAST SAME
  584.               THEN
  585. 1 { } 1 P SIZE
  586. FOR K P K GET
  587.   IF DUP p1 ==
  588.   THEN DROP
  589.   ELSE +
  590.   END
  591. NEXT IRT Z SWAP
  592.               ELSE
  593. LAST OBJ\-> DROP
  594.               END
  595. RDER DUP2 5 PICK 1
  596. + 3 ROLLD 3 \->LIST
  597. 'LAST' STO p1 EVPLY
  598. SWAP p1 EVPLY SWAP
  599. / SWAP ! /
  600.             END
  601.           \>>
  602.         NEXT P SIZE
  603. \->LIST
  604.       \>>
  605.     \>>
  606.   FCTP
  607.     \<<
  608.       IF DUP SIZE 3
  609. >
  610.       THEN DUP
  611. BAIRS SWAP OVER
  612. PDIV DROP FCTP
  613.       END
  614.     \>>
  615.   L\178A
  616.     \<<
  617.       IF DUP TYPE 5
  618. ==
  619.       THEN OBJ\->
  620. \->ARRY
  621.       ELSE OBJ\-> 1
  622. GET \->LIST
  623.       END
  624.     \>>
  625.   EVPLY
  626.     \<< OVER
  627.       IF DUP TYPE 5
  628. ==
  629.       THEN SIZE
  630.       ELSE SIZE 1
  631. GET
  632.       END \-> a r n
  633.       \<< a 1 GET
  634.         IF n 1 >
  635.         THEN 2 n
  636.           FOR i r *
  637. a i GET +
  638.           NEXT
  639.         END
  640.       \>>
  641.     \>>
  642.   COEF
  643.     \<< \-> E n
  644.       \<< 0 n
  645.         FOR I 0 'X'
  646. STO E EVAL 'X'
  647. PURGE E 'X' \.d 'E'
  648. STO I ! /
  649.         NEXT 2 n 1
  650. +
  651.         FOR I I
  652. ROLL
  653.         NEXT n 1 +
  654. \->LIST
  655.       \>>
  656.     \>>
  657.   EQ 1
  658.   DIVV
  659.     \<< DUP 1 GET \-> a
  660. b c
  661.       \<< a 1 GET c /
  662. DUP b * a SIZE RDM
  663. a SWAP - OBJ\-> 1
  664. GETI 1 - PUT \->ARRY
  665. SWAP DROP b
  666.       \>>
  667.     \>>
  668.   QUD
  669.     \<< SWAP 2 / NEG
  670. DUP SQ ROT - \v/ DUP2
  671. + 3 ROLLD -
  672.     \>>
  673.   BAIRS
  674.     \<< OBJ\-> 1 1 \-> n
  675. R S
  676.       \<<
  677.         DO 0 n 1 +
  678. PICK 0 0 0 4 PICK 5
  679. n + 7
  680.           FOR J J
  681. PICK R 7 PICK * + S
  682. 8 PICK * + 7 ROLL
  683. DROP DUP 6 ROLLD R
  684. 3 PICK * + S 4 PICK
  685. * + 5 ROLL DROP -1
  686.           STEP 3
  687. PICK SQ 3 PICK 6
  688. PICK * -
  689.           IF DUP 0
  690. ==
  691.           THEN DROP
  692. 1 1
  693.           ELSE 6
  694. PICK 6 PICK * 5
  695. PICK 9 PICK * -
  696. OVER / 4 PICK 9
  697. PICK * 8 PICK 7
  698. PICK * - ROT /
  699.           END DUP
  700. 'S' STO+ SWAP DUP
  701. 'R' STO+
  702.         UNTIL R\->C
  703. ABS .000000001 < 7
  704. ROLLD 6 DROPN
  705.         END n DROPN
  706. 1 R NEG S NEG 3
  707. \->LIST
  708.       \>>
  709.     \>>
  710.   CST { UP EXCO
  711. ROOTS PADD PMUL
  712. PDIV SYML LSYM IRT
  713. }
  714. END @ END OF PG3 DIRECTORY
  715.